#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MCP 数学计算服务

本服务提供基本的数学计算功能，包括：
- 加法
- 减法
- 乘法
- 除法
- 幂运算
- 平方根
- 三角函数
"""

from mcp.server.fastmcp import FastMCP
from typing import List, Dict, Optional, Union
import math

# 创建 MCP 服务实例
mcp = FastMCP("calculator-server")

@mcp.tool()
def add(a: float, b: float) -> str:
    """加法计算
    
    Args:
        a: 第一个数值
        b: 第二个数值
        
    Returns:
        计算结果
    """
    try:
        result = a + b
        return f"{a} + {b} = {result}"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.tool()
def subtract(a: float, b: float) -> str:
    """减法计算
    
    Args:
        a: 第一个数值
        b: 第二个数值
        
    Returns:
        计算结果
    """
    try:
        result = a - b
        return f"{a} - {b} = {result}"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.tool()
def multiply(a: float, b: float) -> str:
    """乘法计算
    
    Args:
        a: 第一个数值
        b: 第二个数值
        
    Returns:
        计算结果
    """
    try:
        result = a * b
        return f"{a} × {b} = {result}"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.tool()
def divide(a: float, b: float) -> str:
    """除法计算
    
    Args:
        a: 被除数
        b: 除数
        
    Returns:
        计算结果
    """
    try:
        if b == 0:
            return "错误: 除数不能为零"
        result = a / b
        return f"{a} ÷ {b} = {result}"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.tool()
def power(base: float, exponent: float) -> str:
    """幂运算
    
    Args:
        base: 底数
        exponent: 指数
        
    Returns:
        计算结果
    """
    try:
        result = base ** exponent
        return f"{base}^{exponent} = {result}"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.tool()
def square_root(number: float) -> str:
    """平方根计算
    
    Args:
        number: 要计算平方根的数值
        
    Returns:
        计算结果
    """
    try:
        if number < 0:
            return f"负数的平方根: {math.sqrt(abs(number))}i"
        result = math.sqrt(number)
        return f"√{number} = {result}"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.tool()
def calculator(expression: str) -> str:
    """综合计算器
    
    Args:
        expression: 数学表达式（支持 +, -, *, /, **, (), sqrt, sin, cos, tan, log）
        
    Returns:
        计算结果
    """
    try:
        # 安全的数学函数
        safe_dict = {
            "__builtins__": {},
            "sqrt": math.sqrt,
            "sin": math.sin,
            "cos": math.cos,
            "tan": math.tan,
            "log": math.log,
            "log10": math.log10,
            "exp": math.exp,
            "pi": math.pi,
            "e": math.e
        }
        
        result = eval(expression, safe_dict)
        return f"表达式: {expression}\n结果: {result}"
    except ZeroDivisionError:
        return "错误: 除零错误"
    except ValueError as e:
        return f"数值错误: {str(e)}"
    except SyntaxError:
        return "语法错误: 表达式格式不正确"
    except Exception as e:
        return f"计算失败: {str(e)}"

if __name__ == "__main__":
    mcp.run(transport="stdio")